// #include "myoptional.h"

// int main()
// {
//     Optional<int> opt;
//     std::cout << "Has value: " << opt.has_value() << std::endl;

//     opt = 42;
//     std::cout << "Has value: " << opt.has_value() << std::endl;
//     std::cout << "Value: " << *opt << std::endl;

//     opt.reset();
//     std::cout << "Has value: " << opt.has_value() << std::endl;

//     opt = 444;
//     std::cout << "Has value: " << opt.has_value() << std::endl;
//     std::cout << "Value: " << *opt << std::endl;

//     return 0;
// }

#include <optional>
#include <vector>
#include <algorithm>
#include <iostream>
#include <cmath>

int findMaxNumber(const std::vector<int> &nums)
{
    if (nums.empty())
        return -1; // 返回-1作为哨兵值。缺点是：-1可能确实是nums的最大值

    return *std::max_element(nums.begin(), nums.end());
}

// bool findMaxNumber(const std::vector<int> &nums, int &max)
// {
//     if (nums.empty())
//         return false;

//     max = *std::max_element(nums.begin(), nums.end());
//     return true;
// }

// std::pair<int, bool> findMaxNumber(const std::vector<int> &nums)
// {
//     if (nums.empty())
//         return {0, false};

//     int a = *std::max_element(nums.begin(), nums.end());
//     return {a, true};
// }

std::optional<int> findMax(const std::vector<int> &nums)
{
    if (nums.empty())
        return std::nullopt; // std::nullopt 表示无效值
    return *std::max_element(nums.begin(), nums.end());
}

std::optional<double> calc(int x) // 计算倒数
{
    if (x == 0)
    {
        return std::nullopt;
    }
    return 1.0 / x;
}

std::optional<double> mySqrt(double x) // 求实数平方根
{
    if (x < 0)
    {
        return std::nullopt;
    }
    return sqrt(x);
}

int main()
{
    std::vector<int> nums = {1, 2, 3, -1, 5};

    // std::optional<int> result = findMax(nums);
    auto result = findMax(nums);
    if (result)
    {
        // std::cout << "Max value: " << *result << std::endl;
        std::cout << "Max value: " << result.value() << std::endl;
    }
    else
    {
        std::cout << "The array is empty." << std::endl;
    }
    return 0;
}
